/*
 * PlainPortalFacadeDelegate.java
 *
 * Created on 10 de noviembre de 2007, 18:38
 *
 * To change this template, choose Tools | Template Manager
 * and open the template in the editor.
 */

package webportlet.model.portletfacade.plain.action;

import java.util.ArrayList;
import java.util.Vector;
import javax.sql.DataSource;
import webportlet.model.consejo.dto.ConsejoDTO;
import webportlet.model.indiceBursatil.dto.IndiceBursatilDTO;
import webportlet.model.marcador.dto.MarcadorDTO;
import webportlet.model.noticia.dto.NoticiaDTO;
import webportlet.model.pagina.dto.PaginaDTO;
import webportlet.model.usuario.dto.UsuarioDTO;
import webportlet.model.util.DataSourceLocator;
import webportlet.model.util.DuplicateInstanceException;
import webportlet.model.util.GlobalNames;
import webportlet.model.portletfacade.exception.IncorrectPasswordException;
import webportlet.model.util.InstanceNotFoundException;
import webportlet.model.util.InternalErrorException;
import webportlet.model.util.PlainActionProcessor;

/**
 *
 * @author Alvarete
 */
public final class PlainPortalFacadeDelegate implements PortalFacadeDelegate {

    private String nick;
    private Long id;
    
    /** Creates a new instance of PlainPortalFacadeDelegale */
    public PlainPortalFacadeDelegate() {
        nick = null;
    }

    public void registerUsuario(UsuarioDTO usuarioDTO)
        throws DuplicateInstanceException, 
               InternalErrorException {

        try {
        
            RegisterUsuarioAction action = new RegisterUsuarioAction(usuarioDTO);
                
            PlainActionProcessor.process(getDataSource(), action);
            this.nick = nick;
            
        } catch (DuplicateInstanceException e) {
            throw e;
        } catch (InternalErrorException e) {
            throw e;
        } catch (Exception e) {
            throw new InternalErrorException(e);
        }
            
    }

    public LoginResultDTO signIn(String nick, String password, boolean passwordIsEncrypted)
        throws InstanceNotFoundException, IncorrectPasswordException,
            InternalErrorException {

        try {
        
            SignInAction action = new SignInAction(nick, 
                password, passwordIsEncrypted);
                
            LoginResultDTO loginResultDTO = 
                (LoginResultDTO) PlainActionProcessor.process(getDataSource(),
                    action);
            this.nick = nick;
            
            return loginResultDTO;
            
        } catch (IncorrectPasswordException e) {
            throw e;
        } catch (InstanceNotFoundException e) {
            throw e;
        } catch (InternalErrorException e) {
            throw e;
        } catch (Exception e) {
            throw new InternalErrorException(e);
        }
                            
    }
        
    public UsuarioDTO getUsuario() throws InternalErrorException {

        try {
        
            GetUsuarioAction action = new GetUsuarioAction(nick);
                
            return (UsuarioDTO) PlainActionProcessor.process(getDataSource(),
                action);
            
        } catch (InstanceNotFoundException e) {
            throw new InternalErrorException(e);
        } catch (InternalErrorException e) {
            throw e;
        } catch (Exception e) {
            throw new InternalErrorException(e);
        }
    
    }
   
    public ConsejoDTO getConsejo(Long id) throws InternalErrorException
    {
        try{
            
            GetConsejoAction action = new GetConsejoAction(id);
            
            return (ConsejoDTO) PlainActionProcessor.process(getDataSource(),action);
            
        }catch(InstanceNotFoundException e){
            throw new InternalErrorException(e);
        } catch (InternalErrorException e) {
            throw e;
        } catch (Exception e) {
            throw new InternalErrorException(e);
        }
        
    }
    
    public void storeUsuario(UsuarioDTO usuarioDTO)
        throws InternalErrorException {

        try {
        
            StoreUsuarioAction action =  new StoreUsuarioAction(usuarioDTO);
                
            PlainActionProcessor.process(getDataSource(), action);
            
        } catch (InstanceNotFoundException e) {
            throw new InternalErrorException(e);
        } catch (InternalErrorException e) {
            throw e;
        } catch (Exception e) {
            throw new InternalErrorException(e);
        }
     
    }

    public void changePassword(String oldClearPassword, String newClearPassword) 
        throws IncorrectPasswordException, InternalErrorException {

        try {
        
            ChangePasswordAction action = new ChangePasswordAction(nick, 
                oldClearPassword, newClearPassword);
                
            PlainActionProcessor.process(getDataSource(), action);
            
        } catch (IncorrectPasswordException e) {
            throw e;
        } catch (InstanceNotFoundException e) {
            throw new InternalErrorException(e);
        } catch (InternalErrorException e) {
            throw e;
        } catch (Exception e) {
            throw new InternalErrorException(e);
        }
    
    }
     public PaginaDTO modificarPagina(PaginaDTO paginaDTO) throws InternalErrorException
     {
         try{
            
            ModificarPaginaAction action = new ModificarPaginaAction(paginaDTO);
            
            return (PaginaDTO) PlainActionProcessor.process(getDataSource(),action);
            
        }catch(InstanceNotFoundException e){
            throw new InternalErrorException(e);
        } catch (InternalErrorException e) {
            throw e;
        } catch (Exception e) {
            throw new InternalErrorException(e);
        }
         
     }
     
    public ArrayList <NoticiaDTO> getListaNoticias(ArrayList <Long> listaIds) 
        throws InstanceNotFoundException, InternalErrorException{
        
        try {
        
            GetListaNoticiasAction action = new GetListaNoticiasAction(listaIds);
                
            return (ArrayList <NoticiaDTO>) 
                PlainActionProcessor.process(getDataSource(), action);
            
        } catch (InstanceNotFoundException e) {
            throw new InternalErrorException(e);
        } catch (InternalErrorException e) {
            throw e;
        } catch (Exception e) {
            throw new InternalErrorException(e);
        }
        
    }
    
     public ArrayList <MarcadorDTO> getListaMarcadores(ArrayList <Long> listaIds) 
        throws InstanceNotFoundException, InternalErrorException{
         
         try {
        
            GetListaMarcadoresAction action = new GetListaMarcadoresAction(listaIds);
                
            return (ArrayList <MarcadorDTO>) 
                PlainActionProcessor.process(getDataSource(), action);
            
        } catch (InstanceNotFoundException e) {
            throw new InternalErrorException(e);
        } catch (InternalErrorException e) {
            throw e;
        } catch (Exception e) {
            throw new InternalErrorException(e);
        }
         
     }
     public ArrayList <IndiceBursatilDTO> getListaIndicesBursatiles(ArrayList <Long> listaIds) 
        throws InstanceNotFoundException, InternalErrorException{
         
         try {
        
            GetListaIndicesBursatilesAction action = 
                    new GetListaIndicesBursatilesAction(listaIds);
                
            return (ArrayList <IndiceBursatilDTO>) 
                PlainActionProcessor.process(getDataSource(), action);
            
        } catch (InstanceNotFoundException e) {
            throw new InternalErrorException(e);
        } catch (InternalErrorException e) {
            throw e;
        } catch (Exception e) {
            throw new InternalErrorException(e);
        }
     
     }
     public PaginaDTO getNuevaPagina(String nickName) 
        throws InstanceNotFoundException, InternalErrorException{
        
         try {
        
            NuevaPaginaUsuarioAction action = new NuevaPaginaUsuarioAction(nickName);
            
                
            return (PaginaDTO) PlainActionProcessor.process(getDataSource(), action);
            
        } catch (InstanceNotFoundException e) {
            throw new InternalErrorException(e);
        } catch (InternalErrorException e) {
            throw e;
        } catch (Exception e) {
            throw new InternalErrorException(e);
        }
         
     }
     
     //Obtener la lista de listas
     
     public Vector getPaginaCompleta(PaginaDTO paginaDTO)
        throws InstanceNotFoundException, InternalErrorException{
         Vector paginaCompleta = new Vector();
         
         paginaCompleta.add(this.getListaNoticias(paginaDTO.getNoticias()));
         paginaCompleta.add(this.getListaMarcadores(paginaDTO.getMarcadores()));
         paginaCompleta.add(this.getListaIndicesBursatiles(paginaDTO.getIndicesBursatiles()));
         paginaCompleta.add(this.getConsejo(paginaDTO.getConsejo()));
         
         return paginaCompleta;
     }
     
    public PaginaDTO aniadirMarcador(MarcadorDTO marcadorDTO, PaginaDTO paginaDTO)
         throws InstanceNotFoundException, InternalErrorException
    {
        try{
         
         ArrayList <Long> lista = new ArrayList();  
            
         CreateMarcadorAction action = new CreateMarcadorAction(marcadorDTO);
         
         marcadorDTO = (MarcadorDTO) PlainActionProcessor.process(getDataSource(), action); 
         
         
         lista = paginaDTO.getMarcadores();
         lista.add(marcadorDTO.getId());
         paginaDTO.setMarcadores(lista);
         return this.modificarPagina(paginaDTO);
            
        } catch (InstanceNotFoundException e) {
            throw new InternalErrorException(e);
        } catch (InternalErrorException e) {
            throw e;
        } catch (Exception e) {
            throw new InternalErrorException(e);
        }
            
            
        
        
    }
     public PaginaDTO borrarMarcador(MarcadorDTO marcadorDTO, PaginaDTO paginaDTO)
         throws InstanceNotFoundException, InternalErrorException
    {
        try{
         
         ArrayList <Long> lista = new ArrayList();  
         //Primero quitamos de la lista de marcadores la relacion
         lista = paginaDTO.getMarcadores();
         lista.remove(marcadorDTO.getId());
         paginaDTO.setMarcadores(lista);
         
         //Borramos el marcador de la tabla de marcadores
         RemoveMarcadorAction action = new RemoveMarcadorAction(marcadorDTO);
         marcadorDTO = (MarcadorDTO) PlainActionProcessor.process(getDataSource(), action);       
         
         return (this.modificarPagina(paginaDTO));
            
        } catch (InstanceNotFoundException e) {
            throw new InternalErrorException(e);
        } catch (InternalErrorException e) {
            throw e;
        } catch (Exception e) {
            throw new InternalErrorException(e);
        }
    }    
     
    private DataSource getDataSource() throws InternalErrorException {
        return DataSourceLocator.getDataSource(
            GlobalNames.MYPORTAL_DATA_SOURCE);       
    }
  
}
